<?php

class IndicadoresGProduccion extends Controller {

    private $_semanaArray;

    const PRODUCCION = 2;

    private $_detalles = array();

    public function __construct() {
        parent::controller();
        $this->load->library(array('chgraficos', 'chcalendario'));
        $this->load->model(array('mcompania', 'mprocesos', 'mservicios', 'mjurisdiccion', 'mprovincia2', 'companiashistoricaactivasmodel',
            'mestatus', 'metapas', 'mmodeloetapas', 'mresponsable', 'usuarios', 'mmodeloservicios', 'mmodeloetapas', 'companiahistorico'));


        $semana = $this->input->post('filtrosema') ? $this->input->post('filtrosema') : 9;

        $this->session->set_userdata('semAc', $semana);

        $this->_semanaArray = $this->chcalendario->semana($semana);


        for ($i = $semana; $i >= 0; $i--) {

            $semana = date('W') - $i;

            if ($semana <= 0) {
                $semana = 52 + $semana;
            }
        }
    }

    public function limpiarProcesos(){
        
        $listadoProceso = $this->mprocesos->LoadProcesos();
        echo 'procesos com problema: <br/>';
        
        foreach ($listadoProceso as $proceso){
            
            $empresa = $this->companiashistoricaactivasmodel->loadRegistroById((int)$proceso->getIdCompania());
          
            if(false == $empresa || null == $empresa){
               // $this->mprocesos->Delete($proceso->getIdProceso());
                echo $proceso->getIdProceso().'<br/>';
            }
            
        }
        
    }
    
    public function index() {

        $this->load->view('second', array('content_page' => 'gproduccionindicadores',
            'menutop' => 6,
            'semanaFiltro' => 9,
            'semana' => $this->_semanaArray,
            'diasRetrazados' => $this->promedioDiasRetrazado(),
            'situacion' => $this->situacionCompania(),
            'diasCamaraDgii' => $this->promedioDiasCamaraDGII(),
            'promedioSemana' => $this->efectividadDCDD(),
            'detalles_efecti' => $this->_detalles,
            'detalle_dias' => $this->_detallesRetrazos,
            'promedio' => $this->graficoPorcentajeFinal()));
    }

    public function data($semana = 9, $id = false) {

        $page = $this->input->post('page') ? $this->input->post('page') : 1; // Pagina Actual o 1 por default
        $sortname = $this->input->post('sidx') ? $this->input->post('sidx') : 'IdCompania'; // Columna para el order by
        $sortorder = $this->input->post('sord') ? $this->input->post('sord') : 'ASC'; // Orden (asc|desc)
        $limit = $this->input->post('rows') ? $this->input->post('rows') : 30;

        $this->_semanaArray = $this->chcalendario->semana($semana);

        $start = $limit * $page - $limit;
        if ($start < 0)
            $start = 0;

        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
        header("Cache-Control: no-cache, must-revalidate");
        header("Pragma: no-cache");

        $fechaFiltro = "";

        foreach ($this->_semanaArray as $semana => $fecha) {

            $fechaI = explode(" ", $fecha[0]);
            $fechaFiltro = $fechaI[0];


            break;
        }


        $records = $this->mcompania->loadOlderCompaniesByWeek($fechaFiltro, 5, self::PRODUCCION);

        $totalRecords = count($this->mcompania->loadOlderCompaniesByWeek($fechaFiltro, 5, self::PRODUCCION));

        $totalPages = ceil($totalRecords / $limit);
        if ($page > $totalPages)
            $page = $totalPages;

        $json_output = array(
            'page' => $page,
            'total' => $totalPages,
            'records' => $totalRecords,
            'rows' => array()
        );

        if ($records != false) {
            foreach ($records as $objetos) {



                $servicios = $this->mservicios->LoadServicioById($objetos->getIdServicio());
                $usuario = $this->usuarios->LoadUsuarioById($objetos->getIdUsuario());
                $responsable = $this->mresponsable->LoadEstatusById($objetos->getIdResponsable());

                $proceso = $this->mprocesos->loadLastProceso($objetos->getIdCompania());
                $procesoFecha = $this->mprocesos->loadProcesosByArray(array('IdCompania' => $objetos->getIdCompania()));
                $procesoFecha = array_reverse($procesoFecha);
                $procesoDgii = $this->mprocesos->loadProcesoById($proceso);

                $procesos = $this->mprocesos->loadProcesoById(intval($proceso));
                $estatus = $this->mestatus->LoadEstatusById($procesos->getIdEstatus());
                $etapa = $this->metapas->LoadEtapaById($procesos->getIdEtapa());



                foreach ($procesoFecha as $k) {
                    if ($procesoDgii->getIdEtapa() == $k->getIdEtapa()) {
                        $fechaProcesoScuenci = $k->getFechaSys();
                    } else {

                        break;
                    }
                }

                $ultimatransaccion = $this->chcalendario->calcularDias($fechaProcesoScuenci);

                $colores_array_etapa = $this->mmodeloetapas->loadModeloEtapas();
                $colores_etapa = $colores_array_etapa[0];

                $bruto_etapa = ($ultimatransaccion / $etapa->GetTiempoEstimado()) * 100;
                $dias = $this->chcalendario->calcularDias($objetos->getFechaUsrCompania());
                $porciento_bruto = ($dias / $servicios->getTiempoServicio()) * 100;

                if ($bruto_etapa >= $colores_etapa->getVerdeModelo() and $bruto_etapa < $colores_etapa->getAmarilloModelo() or $bruto_etapa == 0 or $bruto_etapa < 0) {
                    $imagen_etapa = "<img src='http://company24h.com/c24h/public/images/1.png'/>";
                } elseif ($bruto_etapa >= $colores_etapa->getAmarilloModelo() and $bruto_etapa < $colores_etapa->getRojoModelo()) {
                    $imagen_etapa = "<img src='http://company24h.com/c24h/public/images/2.png'/>";
                } else {
                    $imagen_etapa = "<img src='http://company24h.com/c24h/public/images/3.png'/>";
                }

                $colores_array_servicio = $this->mmodeloservicios->loadModeloServicios();
                $colores_servicios = $colores_array_servicio[0];

                if (($porciento_bruto >= $colores_servicios->getVerdeModelo() and $porciento_bruto < $colores_servicios->getAmarilloModelo()) or $porciento_bruto <= 0) {
                    $imagen = "<img src='http://company24h.com/c24h/public/images/1.png'/>";
                } elseif ($porciento_bruto >= $colores_servicios->getAmarilloModelo() and $porciento_bruto < $colores_servicios->getRojoModelo()) {
                    $imagen = "<img src='http://company24h.com/c24h/public/images/2.png'/>";
                } else {
                    $imagen = "<img src='http://company24h.com/c24h/public/images/3.png'/>";
                }


                $arr = $json_output['rows'][] = array(
                    'IdCompania' => $objetos->getIdCompania(),
                    'NombreCompania' => '<strong>' . $objetos->getNombreCompania() . '</strong>',
                    'IdServicio' => $servicios->getNombreServicio(),
                    'cServicio' => $objetos->getClasificacionS(),
                    'provincia' => $objetos->getIdProvincia(),
                    'FechaUsrCompania' => $objetos->getFechaUsrCompania(),
                    'FechaSistema' => $objetos->getFechaSysCompania(),
                    'dias' => intval($ultimatransaccion),
                    'IdEtapa' => $etapa->GetNombre(),
                    'IdEstatus' => $estatus->getNombre(),
                    'Etapa' => $imagen_etapa,
                    'Total' => $imagen,
                    'User' => $usuario->getUsernameUsuario(),
                    'Responsable' => $responsable->getNombre()
                );
            }
        }

        echo json_encode($json_output);
    }

    public function promedioDiasCamaraDGII() {

        $targetCa = 0;
        $targetDg = 0;
        $porcentajeCamara = 0;
        $porcentajeDGii = 0;



        $registro = array();

        $strCat = "<categories>";

        foreach ($this->_semanaArray as $semana => $fecha) {

            $cantidadSemana = count($this->_semanaArray);

            $fechaI = $fecha[0];
            $fechaF = $fecha[1];
            $filtroSemana ['inicial'] = $fechaI;
            $filtroSemana ['final'] = $fechaF;
            $horas = 0;


            $semanaDetalle = explode("-", $semana);

            $strCat .= "<category label='" . $semanaDetalle[0] . "'/>";

            $registro[$semana]["camara"] = $this->_promedioDiasPorEtapas(2, $fechaI, $fechaF);
            $registro[$semana]["dgii"] = $this->_promedioDiasPorEtapas(3, $fechaI, $fechaF);

            $targetCamara = $registro[$semana]["camara"];
            $porcentajeCamara += $targetCamara;

            $targetDGII = $registro[$semana]["dgii"];
            $porcentajeDGii += $targetDGII;
        }


        $targetCa = $porcentajeCamara / $cantidadSemana;
        $targetDg = $porcentajeDGii / $cantidadSemana;


        $strCat .= "</categories>";

        $strCamara = "<dataset  seriesName='camara'>";
        $strDGII = "<dataset  seriesName='dgii'>";


        foreach ($registro as $semana) {

            $strCamara .= "<set value='" . $semana["camara"] . "'/>";
            $strDGII .= "<set value='" . $semana["dgii"] . "'/>";
        }

        $strCamara .= "</dataset>";
        $strDGII .= "</dataset>";

        $strCat .= $strCamara;
        $strCat .= $strDGII;

        //aqui...
        $strXML = "<chart caption='Promedio de Dias C&aacute;mara y DGII' lineThickness='1' showValues='0' formatNumberScale='0' anchorRadius='2'   divLineAlpha='20' divLineColor='CC3300' divLineIsDashed='1' showAlternateHGridColor='1' alternateHGridColor='CC4400' shadowAlpha='40' labelStep='1' numvdivlines='5' chartRightMargin='35' bgColor='FFFFFF' bgAngle='270' bgAlpha='10,10' alternateHGridAlpha='5'  legendPosition ='RIGHT ' bordercolor='FFFFFF'>";
        $strTarg = "<trendlines> 
                          <line startValue='$targetCa' color='add6f6' displayValue='Target' showOnTop='2'/>
                          <line startValue='$targetDg' color='fbd152' displayValue='Target' showOnTop='2'/>
                       </trendlines></chart>";
        $strXML .= $strCat . $strTarg;
        return $this->chgraficos->renderChartHTML(base_url() . "public/swf_charts/MSLine.swf", "ChartId54", $strXML, "sACsa", 980, 250, 0, 0);
    }

    private function _promedioDiasPorEtapas($etapa, $fechaI, $fechaF) {
        $horasEtapa = 0;
        $diasEtapa = 0;
        $cantidadRegistros = 0;

        $whereEtapa = array("FechaSysProceso >= " => $fechaI,
            "FechaSysProceso <= " => $fechaF,
            "IdEtapa" => $etapa,
            "EtapaActual" => 0);

        $companiasEtapa = $this->mprocesos->loadProcesosWhere($whereEtapa);

        $this->_companias = array();

        /* Si no encuentra nada en la fecha retorna 0 */
        if (!is_array($companiasEtapa)) {
            return 0;
        }

        $cantidadRegistros = 0;
        $diasEtapa = 0;

        foreach ($companiasEtapa as $objetoProseso) {

            if ($this->mprocesos->obtenerPrimerProsesoPorEtapa($objetoProseso->getIdEtapa(), $objetoProseso->getIdCompania()) != $objetoProseso->getIdProceso())
                continue;

            $horasEtapa = 0;
            $todosProcesos = $this->mprocesos->loadProcesosPorIdCompania($objetoProseso->getIdCompania(), $objetoProseso->getIdEtapa());


            foreach ($todosProcesos as $detalleProceso) {
                $horasEtapa += $this->chcalendario->calcularHoras($detalleProceso->getFechaProceso(), $detalleProceso->getFechaS());
            }

            if ($diasEtapa < 0) {
                $diasEtapa *= (-1);
            }

            $diasEtapa += $horasEtapa / 24;
            ++$cantidadRegistros;
        }


        return ($cantidadRegistros == 0) ? 0 : $diasEtapa / $cantidadRegistros;
    }

    /**
     * 
     * Este metodo se utiliza para calucular la diferencia de dias
     * utilizando la fecha que introduce el usuario menos la fecha del sistema.
     */
    public function promedioDiasRetrazado() {

        $registros = array();
        $this->_detallesRetrazos = array();
        $strCat = "<categories>";

        foreach ($this->_semanaArray as $semana => $fecha) {

            $fechaI = $fecha[0];
            $fechaF = $fecha[1];
            $diasDiferencia = 0;

            $semanaDetalle = explode("-", $semana);

            $where = array("FechaSysProceso >= " => $fechaI,
                "FechaSysProceso <= " => $fechaF,
                "clasificacion_proceso" => 2);


            $strCat .= "<category label='" . $semanaDetalle[0] . "'/>";

            $procesos = $this->mprocesos->loadProcesosByArray($where);
            if (is_array($procesos)) {
                foreach ($procesos as $process) {

                    if ($process->getFechaSys() <= $process->getFechaProceso()) {
                        $dias = 0;
                    } else {

                        $compania = $this->companiashistoricaactivasmodel->loadRegistroById($process->getIdCompania());

                        $etpas = $this->metapas->LoadEtapaById($process->getIdEtapa());
                        $usuarios = $this->usuarios->LoadUsuarioById($process->getIdUsuario());
                        $dias = $this->chcalendario->calcularDias($process->getFechaProceso(), $process->getFechaSys());

                        $diasDiferencia += $dias;

                        $datos = array();
                       // $datos['referencia'] = $compania->getNombre();
                       // $datos['etapa'] = $etpas->GetNombre();
                        $datos['fechaR'] = $process->getFechaProceso();
                        $datos['fecha'] = $process->getFechaSys();
                        $datos['diferencia'] = $dias;
                        $datos['usuario'] = $usuarios->getNombreUsuario();
                        $datos['semana'] = $semana;

                        $this->_detallesRetrazos[] = $datos;
                    }
                }
            }

            $registros[$semana]["totalDiasRetrazo"] = $diasDiferencia;
        }

        $strCat .= "</categories>";

        $strDiasRetrazo = "<dataset seriesName='Promedio de Dias Retrazados'>";

        foreach ($registros as $semana) {

            $strDiasRetrazo .= "<set value='" . $semana ["totalDiasRetrazo"] . "'/>";
        }

        $strDiasRetrazo .= "</dataset>";

        $strCat .= $strDiasRetrazo;

        $strXML = "<chart palette='1' caption='Promedio de dias Retrazados Categoria (PRODUCCION)' showLabels='1' showvalues='0'  sYAxisValuesDecimals='2' connectNullData='0' PYAxisName='' SYAxisName=''  numDivLines='4' formatNumberScale='0'>";
        $strXML .= $strCat;
        $strXML .= "</chart>";

        return $this->chgraficos->renderChartHTML(base_url() . "public/swf_charts/MSColumn3DLineDY.swf", "ChartId54", $strXML, "sACsa", 499, 250, 0, 0);
    }

    public function situacionCompania() {

        $totalVerdes = 0;
        $totalAmarillo = 0;
        $totalRojos = 0;
        $dias = 0;

        foreach ($this->_semanaArray as $semana => $fecha) {
            break;
        }

        $strXML = "<chart caption = 'Situaci&oacute;n' baseFontSize='11' showValues='1' xAxisName=''>";

        $fechaI = $fecha[0];
        $where = array("FechaSysCompania >=" => $fechaI,
            "clasificacion_proceso" => 2);

        //Companias que estan activas en la categoria 2 
        $companiasActivas = $this->mcompania->loadCompaniasWhere($where);

        $colores_array_etapa = $this->mmodeloetapas->loadModeloEtapas();
        $colores_etapa = $colores_array_etapa [0];

        foreach ($companiasActivas as $objetos) {

            $proceso = $this->mprocesos->loadLastProceso($objetos->getIdCompania());
            $procesoFecha = $this->mprocesos->loadProcesosByArray(array('IdCompania' => $objetos->getIdCompania()));
            $procesoFecha = array_reverse($procesoFecha);
            $procesoDgii = $this->mprocesos->loadProcesoById($proceso);

            $procesos = $this->mprocesos->loadProcesoById(intval($proceso));
            $etapa = $this->metapas->LoadEtapaById($procesos->getIdEtapa());


            foreach ($procesoFecha as $k) {

                if ($procesoDgii->getIdEtapa() == $k->getIdEtapa()) {
                    $fechaProcesoScuenci = $k->getFechaSys();
                } else {

                    break;
                }
            }

            $ultimatransaccion = $this->chcalendario->calcularDias($fechaProcesoScuenci);

            $colores_array_etapa = $this->mmodeloetapas->loadModeloEtapas();
            $colores_etapa = $colores_array_etapa[0];

            $bruto_etapa = ($ultimatransaccion / $etapa->GetTiempoEstimado()) * 100;

            if ($bruto_etapa >= $colores_etapa->getVerdeModelo() and $bruto_etapa < $colores_etapa->getAmarilloModelo() or $bruto_etapa == 0 or $bruto_etapa < 0) {
                $totalVerdes++;
            } elseif ($bruto_etapa >= $colores_etapa->getAmarilloModelo() and $bruto_etapa < $colores_etapa->getRojoModelo()) {

                $totalAmarillo++;
            } else {

                $totalRojos++;
            }
        }

        $strXML .= "<set label = 'Verdes' value ='" . $totalVerdes . "' color='#89942c'/>";
        $strXML .= "<set label = 'Amarillos' value ='" . $totalAmarillo . "' color='#FAE421'/>";
        $strXML .= "<set label = 'Rojos' value ='" . $totalRojos . "' color='#FF5252'/>";

        $strXML .= "</chart>";

        return $this->chgraficos->renderChartHTML(base_url() . "public/swf_charts/Pie3D.swf", "ChartId5", $strXML, "Pizza", 375, 250, false);
    }

    public function efectividadDCDD() {

        $registro = array();
        $strCat = "<categories>";
        /*
         * 2  => Camara
         * 3  => DGII
         * 9  => Documentos
         * 16 => DFP
         * */
        $etapas = array(2, 3, 9, 16);


        foreach ($this->_semanaArray as $semana => $fecha) {

            $fechaI = $fecha[0];
            $fechaF = $fecha[1];
            $filtroFecha['inicial'] = $fechaI;
            $filtroFecha['final'] = $fechaF;
            $resurtado = 0;
            $totalDeRegistros = 0;
            $valor = 0;

            $semanaDetalle = explode("-", $semana);

            $where = array("FechaSysProceso >= " => $fechaI,
                "FechaSysProceso <= " => $fechaF);

            $strCat .= "<category label='" . $semanaDetalle[0] . "'/>";

            $companiasProcesos = $this->mprocesos->ObtenerProcesosAgrupados('IdCompania', $etapas, $filtroFecha);

            if (is_array($companiasProcesos)) {


                foreach ($companiasProcesos as $registroDetallado) {

                    $horasProceso = 0;

                    if ($this->mprocesos->obtenerPrimerProsesoPorEtapa($registroDetallado->getIdEtapa(), $registroDetallado->getIdCompania()) != $registroDetallado->getIdProceso())
                        continue;


                    $totalDeRegistros++;
                    $tiempoEstimado = $this->metapas->LoadEtapaById($registroDetallado->getIdEtapa())->GetTiempoEstimado();

                    $todosProcesos = $this->mprocesos->loadProcesosPorIdCompania($registroDetallado->getIdCompania(), $registroDetallado->getIdEtapa());
                    $datos = array();
                    $cantidadHoras = 0;


                    foreach ($todosProcesos as $procesosDetalles) {

                        $fechaFinal = ($procesosDetalles->getFechaS() == '0000-00-00 00:00:00') ? date("Y-m-d H:i:s") : $procesosDetalles->getFechaS();

                        $horasProceso += $this->chcalendario->calcularHoras($procesosDetalles->getFechaProceso(), $fechaFinal);

                        $etpas = $this->metapas->LoadEtapaById($procesosDetalles->getIdEtapa());
                        $companias = $this->companiashistoricaactivasmodel->loadRegistroById($procesosDetalles->getIdCompania());

                        $cantidadHoras +=number_format($horasProceso, 2, '.', '');
                    }
                    
                    $resurtado = ($horasProceso > ($tiempoEstimado * 24)) ? 0 : 1;
                   // $datos['referencia'] = $companias->getNombre();
                    $datos['etapa'] = $etpas->GetNombre();
                    $datos['horas_consumidas'] = $cantidadHoras;
                    $datos['horas_permitidas'] = $tiempoEstimado * 24;
                    $datos['diferencia'] = intval($datos['horas_permitidas']) - intval($datos['horas_consumidas']);
                    $datos['valoracion'] = $resurtado;
                    $datos['semana'] = $semana;

                    if ($resurtado > 0) {

                        $valor += $resurtado;
                    }
                    $this->_detalles[] = $datos;
                }
            }

            $valorBarra = ($totalDeRegistros > 0) ? ($valor / $totalDeRegistros) : 0;
            $valorBarra = $valorBarra * 100;
            $valorBarra = number_format($valorBarra, 2);

            $registro[$semana]["companias"] = $valorBarra;

            $registro[$semana]["cantidad"] = $totalDeRegistros;
        }

        $strCat .= "</categories>";

        $strEfectividad = "<dataset seriesName='Efectividad'>";
        $strCantidad = "<dataset  seriesName='Cantidad' parentYAxis='S'>";


        foreach ($registro as $semana) {
            $strEfectividad .= "<set value='" . $semana["companias"] . "'/>";
            $strCantidad .= "<set value='" . $semana["cantidad"] . "'/>";
        }

        $strEfectividad .= "</dataset>";
        $strCantidad .= "</dataset>";


        $strCat .= $strEfectividad;
        $strCat .= $strCantidad;


        $strXML = "<chart palette='1' caption='Efectividad Compa&ntilde;ias Camara, DGII, DFP, Documentos Vs Cantidad por Semana' showLabels='1' showvalues='0'  sYAxisValuesDecimals='2' connectNullData='0' PYAxisName='' SYAxisName=''  numberSuffix='%2525'  numDivLines='4' formatNumberScale='0'>";
        $strXML .=$strCat;
        $strXML .= "</chart>";
        return $this->chgraficos->renderChartHTML(base_url() . "public/swf_charts/MSColumn3DLineDY.swf", "ChartId54", $strXML, "sACsa", 499, 250, 0, 0);
    }

    private function _calcularHorasConsumidas($idCompania, $filtroSemana = false, $etapa = false) {

        $horasConsumidas = 0;

        $process_array = $this->mprocesos->loadProcesosPorIdCompania($idCompania, $etapa, 0, $filtroSemana);

        foreach ($process_array as $process_obj) {
            $fechas = date("Y-m-d H:i:s");
            $fechas = ($process_obj->getFechaS() == '0000-00-00 00:00:00') ? $fechas : $process_obj->getFechaS();
            $horasConsumidas += $this->chcalendario->calcularHoras($process_obj->getFechaProceso(), $fechas);
        }

        return intval($horasConsumidas);
    }

    private function _promedioUltimasSemanas($valor) {


        $strXML = "<chart bgAlpha='0' bgColor='FFFFFF' lowerLimit='0' upperLimit='100' numberSuffix='%25' showBorder='0' basefontColor='424242' chartTopMargin='25' chartBottomMargin='25' chartLeftMargin='25' chartRightMargin='25' toolTipBgColor='80A905' gaugeFillMix='{dark-10},FFFFFF,{dark-10}' gaugeFillRatio='3'>
		  
                     <colorRange>
                     <color minValue='0' maxValue='45' code='FF654F'/>
                     <color minValue='45' maxValue='80' code='F6BD0F'/>
                     <color minValue='80' maxValue='100' code='8BBA00'/>
                     </colorRange>

                     <dials>
                     	<dial value='" . $valor . "' rearExtension='1'/>
                     </dials>
                    
            
                     <annotations>
                     <annotationGroup id='Grp1' showBelow='1'>
                     <annotation type='rectangle' x='5' y='5' toX='500' toY='250' radius='10' color='ffffff' showBorder='0'/>
                     </annotationGroup>
                     </annotations>
                      
                     
                     <styles>
                     	<definition>
                     		<style name='RectShadow' type='shadow' strength='0'/>
                     		<style name='trendvaluefont' type='font' bold='1' borderColor='f5522f'/>
                     	</definition>
                     	
                     	<application>
                     	   <apply toObject='Grp1' styles='RectShadow'/>
                     	   <apply toObject='Trendvalues' styles='trendvaluefont'/>
                     	</application>
                     	</styles>
                     </chart>";

        return $this->chgraficos->renderChartHTML(base_url() . "public/swf_charts/AngularGauge.swf", '', $strXML, '', 390, 200, 0, 0);
    }

    /**
     * 
     * Enter description here ...
     * @param array $semana
     */
    public function graficoPorcentajeFinal($semana = 9) {
        $totalDeRegistros = 0;
        $etapas = array(2, 3, 9, 16);
        $this->_semanaArray = $this->chcalendario->semana($semana);
        $this->_semanaArray = array_reverse($this->_semanaArray);

        $aux = 1;

        $valorBarraTotal = 0;

        foreach ($this->_semanaArray as $semana => $fecha) {
            if ($aux > 1 && $aux <= 5) {

                $fechaI = $fecha[0];
                $fechaF = $fecha[1];
                $filtroFecha['inicial'] = $fechaI;
                $filtroFecha['final'] = $fechaF;
                $resurtado = 0;
                $totalDeRegistros = 0;
                $valor = 0;

                $semanaDetalle = explode("-", $semana);

                $where = array("FechaSysProceso >= " => $fechaI,
                    "FechaSysProceso <= " => $fechaF);


                $companiasProcesos = $this->mprocesos->ObtenerProcesosAgrupados('IdCompania', $etapas, $filtroFecha);

                if (is_array($companiasProcesos)) {


                    foreach ($companiasProcesos as $registroDetallado) {

                        $horasProceso = 0;

                        if ($this->mprocesos->obtenerPrimerProsesoPorEtapa($registroDetallado->getIdEtapa(), $registroDetallado->getIdCompania()) != $registroDetallado->getIdProceso())
                            continue;


                        $totalDeRegistros++;
                        $tiempoEstimado = $this->metapas->LoadEtapaById($registroDetallado->getIdEtapa())->GetTiempoEstimado();

                        $todosProcesos = $this->mprocesos->loadProcesosPorIdCompania($registroDetallado->getIdCompania(), $registroDetallado->getIdEtapa());
                        $datos = array();
                        $cantidadHoras = 0;
                        foreach ($todosProcesos as $procesosDetalles) {

                            $fechaFinal = ($procesosDetalles->getFechaS() == '0000-00-00 00:00:00') ? date("Y-m-d H:i:s") : $procesosDetalles->getFechaS();

                            $horasProceso += $this->chcalendario->calcularHoras($procesosDetalles->getFechaProceso(), $fechaFinal);

                            $etpas = $this->metapas->LoadEtapaById($procesosDetalles->getIdEtapa());
                            $companias = $this->companiashistoricaactivasmodel->loadRegistroById($procesosDetalles->getIdCompania());

                            $cantidadHoras +=number_format($horasProceso, 2, '.', '');
                        }

                        $resurtado = ($horasProceso > ($tiempoEstimado * 24)) ? 0 : 1;
                      //  $datos['referencia'] = $companias->getNombre();
                        $datos['etapa'] = $etpas->GetNombre();
                        $datos['horas_consumidas'] = $cantidadHoras;
                        $datos['horas_permitidas'] = $tiempoEstimado * 24;
                        $datos['diferencia'] = intval($datos['horas_permitidas']) - intval($datos['horas_consumidas']);
                        $datos['valoracion'] = $resurtado;
                        $datos['semana'] = $semana;

                        if ($resurtado > 0) {

                            $valor += $resurtado;
                        }
                        $this->_detalles[] = $datos;
                    }
                }
                $valorBarra = ($totalDeRegistros > 0) ? ($valor / $totalDeRegistros) : 0;
                $valorBarra = ($valorBarra) * 100;
                $valorBarra = number_format($valorBarra, 2, '.', '');

                $valorBarraTotal += $valorBarra;
                $valorBarra = 0;
            }

            $aux++;
        }
        $totalPorcentaje = $valorBarraTotal / 4;

        return $this->_promedioUltimasSemanas(number_format($totalPorcentaje, 2, '.', ''));
    }

}

